package main

import (
	"encoding/json"
	"fmt"
)

//一个go语言包中定义的标识符（函数名，变量名等）是首字母大写的，
//那么就是对外可见的（public）
//结构体的字段的可见性（首字母大写对外可见）与json（key,value）序列化
//
type Student struct {
	ID   int
	Name string
}

//定制化结构体 tag key:"vakue" key:"vakue"
type class struct {
	Title    string    `json:"title"`
	Students []Student `json:"stu"`
}
type user struct {
	//tag标签 也能实现反序列化
	name string `json:"name"`
	age  int
}

func main() {

	//创建班级对象
	c1 := class{
		Title:    "火箭班",
		Students: make([]Student, 0, 20),
	}
	//往班级里面添加学生
	for i := 0; i < 10; i++ {
		temp := newStudent(i, fmt.Sprint("stu%02d", i))
		c1.Students = append(c1.Students, temp)
	}
	fmt.Printf("%#v\n", c1)

	//json序列化：go语言中的数据 -》json字符串
	//转json
	data, err := json.Marshal(c1)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("%s\n", data)
	fmt.Printf("%T\n", data)
	//json 反序列化 -》go 语言的数据
	jsonStr := `{
  "title": "火箭班",
  "stu": [
    {
      "ID": 0,
      "Name": "ccc"
    },
    {
      "ID": 1,
      "Name": "bbb"
    },
    {
      "ID": 2,
      "Name": "aaa"
    }
  ]
}`
	var c2 class
	err = json.Unmarshal([]byte(jsonStr), &c2)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("%#v\n", c2)
}

func newStudent(id int, name string) Student {
	return Student{
		ID:   id,
		Name: name,
	}
}
